#include <iostream>
using namespace std;
const int N = 20;

int n;
char g[N][N];                // 坐标
bool col[N], dg[N], udg[N]; // 同列，同对角线，同反对角线

void dfs(int u) // 对每一行进行搜索
{
    if (u == n) // 搜索完全
    {
        for (int i = 0; i < n; i++) // 输出
            puts(g[i]);
        puts("");
        return; // 回溯
    }
    for (int i = 0; i < n; i++) // 对每行的每一个点进行遍历
    {
        if (!col[i] && !dg[u + i] && udg[n - u + i]) // 未被占用
        {
            g[u][i] = 'Q';                              // 让该点为'Q'
            col[i] = dg[u + i] = udg[n - u + i] = true; // 该位置已占用
            dfs(u + 1);                                 // 搜索下一行
            col[i] = dg[u + i] = udg[n - u + i] = true; // 恢复未占用
            g[u][i] = '.';                              // 恢复该点为'.'
        }
    }
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) // 将每个点赋初值为.
        for (int j = 0; j < n; j++)
            g[i][j] = '.';

    dfs(0); // 从下标为0开始搜索
    return 0;
}
